package com.sea.base.ext.global

import com.google.gson.JsonElement
import com.google.gson.JsonNull
import com.google.gson.JsonObject
import com.google.gson.JsonPrimitive
import com.google.gson.reflect.TypeToken
import com.sea.base.json.Json
import com.sea.base.json.ParameterizedTypeImpl

/**
 * 前言：由于Gson是implementation进来的
 * 1.当调用者调用暴露的Gson对象时会报错，编辑器报错（此时需要调用者导包，没问题）
 * 2.当调用者调用重载方法非暴露对象时，理论上调用者应无需导包（编辑器也没有报错），但编译却直接报错（编译bug）
 * 由于第二个问题的bug，所以将这几个暴露Gson的方法改成拓展
 */

/**
 * 获取string，非String返回null
 */
fun JsonObject?.getString(key: String): String? {
    val je = this?.get(key)
    if (je is JsonPrimitive) {
        return je.getAsString()
    }
    return null //null、JsonNull、JsonObject、JsonArray
}

fun <T> Json.fromJson(je: JsonElement?, clazz: Class<T>): T? {
    return singleInstance.fromJson(je, clazz)
}

fun <T> Json.fromJson(je: String?, tt: TypeToken<T>): T? {
    return singleInstance.fromJson(je, tt)
}

fun <T> Json.fromJsonArray(je: JsonElement?, clazz: Class<T>): List<T> {
    val res: List<T>? = singleInstance.fromJson(je, ParameterizedTypeImpl(clazz))
    return res ?: emptyList()
}

/**
 * 转换为json对象
 *
 * @return 非null，null会被表示成[JsonNull]
 */
fun Json.toJsonTree(obj: Any?): JsonElement {
    return singleInstance.toJsonTree(obj)
}